package com.lagou.edu.servlet;

import com.lagou.edu.factory.MyApplicationContext;
import com.lagou.edu.pojo.Result;
import com.lagou.edu.service.TransferService;
import com.lagou.edu.utils.JsonUtils;
import com.lagou.edu.utils.MyApplicationContextUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 应癫
 */
@WebServlet(name = "transferServlet", urlPatterns = "/transferServlet")
public class TransferServlet extends HttpServlet {

    private TransferService transferService;

    @Override
    public void init() {

        /* 实现作业要求：
         * 1.自定义注解（@MyComponent、@MyService、@MyRepository），实例化IoC对象
         *   通过@MyComponent别名的方式处理了@MyService、@MyRepository
         *   处理了自定义注解中使用value的场合
         *   该类实现接口的场合，再将接口全限定名作为key放入容器，但实例化对象相同
         *
         * 2.自定义注解（@MyAutowired），实现IoC自动注入，维护对象依赖关系
         *   处理了属性使用Qualifier限定名称的场合
         *   处理了属性名称和类型不一致的场合
         *   使用递归方式维护多层依赖关系
         *   如果以上步骤没有查找到（该属性为接口类型），则使用接口全限定名称查找
         *
         * 3.自定义注解（@MyTransactional），使用动态代理对象，实现声明式事务控制
         *   该类实现接口的场合使用jdk原生动态代理技术，否则使用cglib方式生成代理对象，最后替换原对象
         *
         * 主要编写文件：
         *   MyApplicationContextUtils.java
         *   MyApplicationContext.java
         *   StringUtils.java
         */

        // 初始化加载IoC容器
        MyApplicationContext myApplicationContext = MyApplicationContextUtils.getMyApplicationContext();
        // 从容器中获取bean对象
        transferService = (TransferService) myApplicationContext.getBean("com.lagou.edu.service.TransferService");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 设置请求体的字符编码
        req.setCharacterEncoding("UTF-8");

        String fromCardNo = req.getParameter("fromCardNo");
        String toCardNo = req.getParameter("toCardNo");
        String moneyStr = req.getParameter("money");
        int money = Integer.parseInt(moneyStr);

        Result result = new Result();

        try {

            // 调用service层方法
            transferService.transfer(fromCardNo, toCardNo, money);
            result.setStatus("200");
        } catch (Exception e) {
            e.printStackTrace();
            result.setStatus("201");
            result.setMessage(e.toString());
        }

        // 响应
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().print(JsonUtils.object2Json(result));
    }
}
